<?php
/**
 * Author:   tangxiaowen
 * Email:    846506584@qq.com
 * Date:     2019/6/10 0010
 * Describe: 滴滴风控任务类 - 滴滴风控又名指迷风控.
 */

namespace app\api\controller\task;

use think\Controller;
use think\Log;

class Didi extends Controller
{
    public function __construct()
    {
        parent::__construct();
        //日志初始化保存地址
        $setPath = strtolower(request()->module().'/'.request()->controller().'/'.request()->action().'/');
        Log::init(['path' => LOG_PATH.$setPath, 'type' => 'file']);
    }

    /**
     * 获取放款时间在过去3个月内请求过指迷风控的历史放款订单的最新状态生成压缩csv.gz文件 提供给指迷风控拉取
     * 主：由于订单创建时未设置风控标识符，此方法仅在本系统设置为滴滴风控时执行.
     */
    public function paymentOrder()
    {
        //校验系统风控是否为滴滴
        $chcekFK = model('System')->getSystemInfo();
        if ($chcekFK['fengkong'] != 1) {
            //写入记录日志
            \Think\Log::record('系统风控不是滴滴风控 paymentOrder 方法不执行');
            die;
        }

        //获取今天时间 与 3月前的时间
        $todayTime = strtotime(date('Y-m-d'));
        $startTime = strtotime('-3 month', $todayTime);

        //获取过去3个月内的立时放款订单数据的最新状态
        $orderData = db('loans_applylist')->alias('a')
            ->join('xb_mem_info m', 'a.UserID = m.ID')
            ->join('xb_loans_hklist h', 'a.ID = h.ApplyID', 'LEFT')
            ->where('OpenTime', 'between time', [$startTime, $todayTime])
            ->field('IDCard,TrueName,Mobile,ApplyTime,OpenTime,YyFkTime,LoanStatus,HkTime')
            ->select();
        $paraName = $this->getParaName();

        //处理数据 写入cvs文件中
        $array_keys = array_keys($orderData[0]);
        $temp = [];
        foreach ($orderData as $k => $v) {
            foreach ($v as $kk => $vv) {
                $temp[$k][] = $vv;
            }
            $temp[$k][] = $paraName;
        }
        $result = $this->putCsv('temp.cvs', $temp, $array_keys);
    }

    /**
     * [putCsv description].
     *
     * @param string $csvFileName [description] 文件名
     * @param array  $dataArr     [description] 数组，每组数据都是使用，分割的字符串
     * @param string $haderText   [description] 标题（默认第一行）
     * @param int    $line        [description] 从第几行开始写
     * @param int    $offset      [description] 共计写几行
     *
     * @return [type] [description]
     */
    public function putCsv($csvFileName, $dataArr, $haderText = '', $line = 0, $offset = 0)
    {
        $handle = fopen($csvFileName, 'w'); //写方式打开
        if (!$handle) {
            \Think\Log::record('写入cvs文件 临时文件名名称打开失败');
            return false;
        }
        //判断是否定义头标题
        if (!empty($haderText)) {
            $re = fputcsv($handle, $haderText); //该函数返回写入字符串的长度。若出错，则返回 false。。
            if(!$re){
                \Think\Log::record('写入cvs文件 表头数据写入失败');
            }
        }
        foreach ($dataArr as $key => $value) {
            $re = fputcsv($handle, $value); //该函数返回写入字符串的长度。若出错，则返回 false。。
            if(!$re){
                \Think\Log::record('写入cvs文件 写入内容第'.$key.'行写入失败');
            }
        }

        //将cvs文件压缩成cvs.gz包
        $this->gz_file($csvFileName);

        //关闭资源
        unset($handle);
        //删除服务器临时文件
        unlink($csvFileName);
    }

    /**
     * 将文件添加至GZ文件
     * @param path $file 文件路径
     */
    public function gz_file($file)
    {
        $zgName = './didi/'.date('Y-m-d').'.cvs.gz';
        $fp = gzopen($zgName, 'w9');
        gzwrite($fp, file_get_contents($file));
        gzclose($fp);
    }

    /**
     * 获取滴滴模型号.
     *
     * @return string
     */
    public function getParaName()
    {
        $data = db('sys_integrate')->alias('i')
            ->join('xb_sys_inteparameter n', 'i.ID = n.IntegrateID')
            ->where(['i.EName' => 'didi'])
            ->find();
        if ($data) {
            return $data['ParaName'];
        }

        return '';
    }
}
